package com.cyy.list;

/**
 * 抽象类 通过该抽象类 实现部分 List 接口的方法
 * @author 会玩的洋洋
 * @since 2022-2-21
 * @param <E>
 */
public abstract class AbstractList<E> implements List<E> {
    /**
     * 线性集合元素个数
     */
    protected int size = 0;

    /**
     * 判断是否空
     */
    @Override
    public boolean isEmpty() {
        return this.size == 0;
    }

    /**
     * 元素数量
     */
    @Override
    public int size() {
        return this.size;
    }

    /**
     * 是否包含某个元素
     */
    @Override
    public boolean contains(E element) {
        return indexOf(element) != FAILED_RETURN;
    }

    /**
     * 添加元素到尾部
     */
    @Override
    public void add(E element) {
        add(this.size, element);
    }

    /**
     * 判断输入的 index 是否符合正常范围
     * @param index 传入的 index 下标
     */
    protected void rangeCheck(int index) {
        // index >= size 因为 如果 index == size 则越界异常
        if (index >= size || index < 0) {
            outOfBound(index);
        }
    }

    /**
     * 判断添加是 index 是否符合正常范围
     * @param index 传入的 index 下标
     */
    protected void rangeCheckAdd(int index) {
        // index > size，添加可以 index == size
        if (index > size || index < 0) {
            outOfBound(index);
        }
    }

    protected void outOfBound(int index) {
        throw new IndexOutOfBoundsException("越界异常：size = " + this.size + "index = " + index);
    }
}
